Conversation
Resolves merge conflicts and adds 5 new Turing regional species classifiers: Japan, Kenya-Uganda, Madagascar, Singapore, Thailand. Also fixes duplicate TuringKenyaUgandaSpeciesClassifier class and double slashes in object store URLs from the upstream branch. NOTE: Only kenya-uganda model weights and labels exist in the object store. The following 4 models have 404 URLs and are NOT yet usable: - turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt - turing-madagascar_v01_resnet50_2024-07-01-13-01_state.pt - turing-japan_v01_resnet50_2024-11-22-17-22_state.pt - turing-singapore_v02_resnet50_2024-11-21-19-58_state.pt Corresponding category_map JSON files are also missing. Contact kgoldmann@turing.ac.uk to upload the weights. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
📝 WalkthroughWalkthroughFive new Turing-based moth species classifiers were added to the ML layer and exposed via API wrapper classes; three of those (Anguilla v02, Japan, Madagascar) were registered as selectable classifiers in the API, while Singapore and Thailand wrappers were added but not registered/commented. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
trapdata/api/api.py (1)
46-50:⚠️ Potential issue | 🔴 CriticalService startup will fail if any classifier has a 404
labels_pathURL.
initialize_service_info()instantiates all classifiers inCLASSIFIER_CHOICESwithout error handling. During instantiation, each classifier's__init__callsget_labels(labels_path), which invokesget_or_download_file(). This function callsrequests.get()and raisesHTTPErrorfor 404s or other HTTP errors (viaresponse.raise_for_status()at line 107 intrapdata/ml/utils.py). Any unhandled exception propagates throughlifespan(), causing FastAPI to abort startup entirely.Since the PR description acknowledges four of the five newly added classifiers have 404
labels_pathURLs, either upload the missing label files first or wrapinitialize_service_info()in a try/except block to prevent a single failing classifier from bringing down the entire service.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@trapdata/api/api.py` around lines 46 - 50, The startup currently calls initialize_service_info() inside lifespan() without error handling so any HTTPError from get_or_download_file()/get_labels() during classifier instantiation will abort FastAPI startup; wrap the initialization in a try/except in lifespan() (catch Exception or requests.HTTPError) and on failure log the full error (use logger.exception or include the exception message) and set app.state.service_info to a safe default (e.g., empty dict or partial result) so the service can start; alternatively, move try/except into initialize_service_info() around each classifier construction so failing classifiers are skipped but others are initialized.
🧹 Nitpick comments (1)
trapdata/ml/models/classification.py (1)
441-442: URL string style is inconsistent with the rest of the file.All other classifiers in this file use parenthesized multi-line implicit string concatenation for
weights_path/labels_path. The new four classifiers use single-line strings. Consider aligning for consistency.♻️ Proposed style alignment (Thailand shown; apply same pattern to the other three)
class TuringThailandSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing): name = "Turing Thailand Species Classifier" description = "Trained on 21st November 2024 by Turing team using Resnet50 model." - weights_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" - labels_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/01_thailand_data_category_map.json" + weights_path = ( + "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/" + "turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" + ) + labels_path = ( + "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/" + "01_thailand_data_category_map.json" + )Also applies to: 448-449, 455-456, 462-463
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@trapdata/ml/models/classification.py` around lines 441 - 442, The new classifier assignments use single-line string literals for weights_path and labels_path which is inconsistent with the rest of the file; update the four new classifiers to use the same parenthesized multi-line implicit string concatenation style as the other classifiers by replacing the single-line weights_path and labels_path values with parenthesized, split strings (keeping the exact URLs intact) for the variables named weights_path and labels_path in the relevant classifier blocks in classification.py.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@trapdata/ml/models/classification.py`:
- Around line 440-441: The description strings for the classifier classes
TuringThailandSpeciesClassifier, TuringMadagascarSpeciesClassifier, and
TuringJapanSpeciesClassifier are inconsistent with the dates encoded in their
weights_path filenames; update each class's description field to match the date
in its weights_path (e.g., use 2024-11-21 for the Thailand model, 2024-07-01 for
the Madagascar model, and 2024-11-22 for the Japan model), and confirm with the
Turing team before committing to ensure the corrected human-readable dates are
accurate.
---
Outside diff comments:
In `@trapdata/api/api.py`:
- Around line 46-50: The startup currently calls initialize_service_info()
inside lifespan() without error handling so any HTTPError from
get_or_download_file()/get_labels() during classifier instantiation will abort
FastAPI startup; wrap the initialization in a try/except in lifespan() (catch
Exception or requests.HTTPError) and on failure log the full error (use
logger.exception or include the exception message) and set
app.state.service_info to a safe default (e.g., empty dict or partial result) so
the service can start; alternatively, move try/except into
initialize_service_info() around each classifier construction so failing
classifiers are skipped but others are initialized.
---
Nitpick comments:
In `@trapdata/ml/models/classification.py`:
- Around line 441-442: The new classifier assignments use single-line string
literals for weights_path and labels_path which is inconsistent with the rest of
the file; update the four new classifiers to use the same parenthesized
multi-line implicit string concatenation style as the other classifiers by
replacing the single-line weights_path and labels_path values with
parenthesized, split strings (keeping the exact URLs intact) for the variables
named weights_path and labels_path in the relevant classifier blocks in
classification.py.
| description = "Trained on 11th November 2024 by Turing team using Resnet50 model." | ||
| weights_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" |
There was a problem hiding this comment.
Inaccurate training dates in descriptions — Madagascar is significantly wrong.
Cross-referencing the description strings against the dates encoded in the weights_path filenames reveals mismatches:
| Class | Description date | Filename date |
|---|---|---|
TuringThailandSpeciesClassifier |
"11th November 2024" | 2024-11-21 (21st Nov) |
TuringMadagascarSpeciesClassifier |
"11th November 2024" | 2024-07-01 (1st July 2024) |
TuringJapanSpeciesClassifier |
"19th November 2024" | 2024-11-22 (22nd Nov) |
The Madagascar discrepancy is the most critical — the description is ~4 months off and contradicts the filename. Please verify with the Turing team and correct before merging.
📝 Proposed corrections
class TuringThailandSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing):
name = "Turing Thailand Species Classifier"
- description = "Trained on 11th November 2024 by Turing team using Resnet50 model."
+ description = "Trained on 21st November 2024 by Turing team using Resnet50 model."
class TuringMadagascarSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing):
name = "Turing Madagascar Species Classifier"
- description = "Trained on 11th November 2024 by Turing team using Resnet50 model."
+ description = "Trained on 1st July 2024 by Turing team using Resnet50 model."
class TuringJapanSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing):
name = "Turing Japan Species Classifier"
- description = "Trained on 19th November 2024 by Turing team using Resnet50 model."
+ description = "Trained on 22nd November 2024 by Turing team using Resnet50 model."Also applies to: 447-448, 454-455
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@trapdata/ml/models/classification.py` around lines 440 - 441, The description
strings for the classifier classes TuringThailandSpeciesClassifier,
TuringMadagascarSpeciesClassifier, and TuringJapanSpeciesClassifier are
inconsistent with the dates encoded in their weights_path filenames; update each
class's description field to match the date in its weights_path (e.g., use
2024-11-21 for the Thailand model, 2024-07-01 for the Madagascar model, and
2024-11-22 for the Japan model), and confirm with the Turing team before
committing to ensure the corrected human-readable dates are accurate.
Upload 9 new files to the Arbutus object store: - Weights: japan, madagascar, singapore, thailand, anguilla v02 - Category maps: japan, madagascar (x2), thailand, anguilla 160cls Add TuringAnguillaV02SpeciesClassifier (160 classes, Nov 2024) as a separate pipeline alongside the existing v01 (79 classes). All URLs verified returning HTTP 200. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The 02_singapore_data_category_map.json file was not included in the original UKCEH archive. Weights are uploaded but the pipeline is commented out of CLASSIFIER_CHOICES until the category map is sourced and uploaded. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
trapdata/ml/models/classification.py (1)
454-476: Inconsistent URL string formatting with the rest of the file.The four new classifiers use single-line URLs while every other classifier in this file uses parenthesized multi-line string concatenation. Consider normalizing for readability.
♻️ Proposed style normalization (Thailand shown; apply the same pattern to Madagascar, Japan, Singapore)
- weights_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" - labels_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/01_thailand_data_category_map.json" + weights_path = ( + "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/" + "turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" + ) + labels_path = ( + "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/" + "01_thailand_data_category_map.json" + )🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@trapdata/ml/models/classification.py` around lines 454 - 476, The weights_path and labels_path strings in TuringThailandSpeciesClassifier, TuringMadagascarSpeciesClassifier, TuringJapanSpeciesClassifier, and TuringSingaporeSpeciesClassifier are single-line URLs while the rest of the file uses parenthesized multi-line string concatenation for long URLs; update the weights_path and labels_path assignments in those classes (refer to the class symbols TuringThailandSpeciesClassifier, TuringMadagascarSpeciesClassifier, TuringJapanSpeciesClassifier, TuringSingaporeSpeciesClassifier and the attributes weights_path and labels_path) to use the same parenthesized multi-line string concatenation style used elsewhere for consistency and readability.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@trapdata/ml/models/classification.py`:
- Around line 451-476: Four classifiers (TuringThailandSpeciesClassifier,
TuringMadagascarSpeciesClassifier, TuringJapanSpeciesClassifier,
TuringSingaporeSpeciesClassifier) reference weights_path/labels_path URLs that
return 404 and will fail during the base-class download step; either update each
class's weights_path and labels_path to valid, accessible URLs (ensure the
verification script returns HTTP 200 for both files) or remove/disable their
registration in the API (trapdata/api/api.py) until the assets are
uploaded—locate the classes above and replace the broken URLs with the correct
object-arbutus links or comment out/unregister these class definitions so the
API does not advertise non-functional models.
---
Duplicate comments:
In `@trapdata/ml/models/classification.py`:
- Line 453: The description strings for some trained models are incorrect;
update the relevant description assignments (the description variable in the
country-specific model definitions) to match their filenames: for Thailand
change "Trained on 11th November 2024 by Turing team using Resnet50 model." to
"Trained on 21st November 2024 by Turing team using Resnet50 model.", for
Madagascar change "Trained on 11th November 2024 by Turing team using Resnet50
model." to "Trained on 1st July 2024 by Turing team using Resnet50 model.", and
for Japan change "Trained on 19th November 2024 by Turing team using Resnet50
model." to "Trained on 22nd November 2024 by Turing team using Resnet50 model.";
ensure these exact strings replace the current description assignments so the
dates now match their filenames.
---
Nitpick comments:
In `@trapdata/ml/models/classification.py`:
- Around line 454-476: The weights_path and labels_path strings in
TuringThailandSpeciesClassifier, TuringMadagascarSpeciesClassifier,
TuringJapanSpeciesClassifier, and TuringSingaporeSpeciesClassifier are
single-line URLs while the rest of the file uses parenthesized multi-line string
concatenation for long URLs; update the weights_path and labels_path assignments
in those classes (refer to the class symbols TuringThailandSpeciesClassifier,
TuringMadagascarSpeciesClassifier, TuringJapanSpeciesClassifier,
TuringSingaporeSpeciesClassifier and the attributes weights_path and
labels_path) to use the same parenthesized multi-line string concatenation style
used elsewhere for consistency and readability.
The Thailand category map has 3822 classes but the model weights only have 3800 output neurons, causing a RuntimeError at model load time. This also crashes the /info endpoint since it initializes all classifiers at startup. Disabling until corrected data is available from UKCEH. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@trapdata/api/api.py`:
- Line 16: Remove the unused "noqa: E501" suppression on the import line
starting with "from .models.classification import (" (RUF100) and convert the
explanatory text that follows it ("disabled: Singapore - no category map,
Thailand - map/weights mismatch") into a regular inline or above-line Python
comment so the rationale is preserved but the dead noqa directive is eliminated.
In `@trapdata/api/models/classification.py`:
- Around line 249-250: Add a disable comment above the
MothClassifierTuringThailand class like the one used for
MothClassifierTuringSingapore to make its disabled state explicit and prevent
surprise errors; specifically note that this classifier is disabled because the
category map is not available and that attempting to instantiate it will raise a
RuntimeError in model.load_state_dict() due to a class-count mismatch (3822 vs.
3800). Place the comment immediately before the MothClassifierTuringThailand
class definition to mirror the existing pattern used for
MothClassifierTuringSingapore.
In `@trapdata/ml/models/classification.py`:
- Around line 451-455: Add a 3-line "# NOTE:" comment block above the
TuringThailandSpeciesClassifier declaration (like the one above
TuringSingaporeSpeciesClassifier) explaining that this classifier is
intentionally disabled because the labels file contains 3822 classes while the
Resnet50 model checkpoint has 3800 output neurons which causes
model.load_state_dict() to raise a size-mismatch RuntimeError; instruct
maintainers to not instantiate this class until the weights or labels are
corrected (or the checkpoint is replaced) and reference the class name
TuringThailandSpeciesClassifier and the failing call model.load_state_dict for
clarity.
---
Duplicate comments:
In `@trapdata/ml/models/classification.py`:
- Around line 453-467: Update the description strings to match the dates
embedded in each class's weights filename: change
TuringThailandSpeciesClassifier.description to use "21st November 2024" to match
the file date 2024-11-21, change TuringMadagascarSpeciesClassifier.description
to use "1st July 2024" to match 2024-07-01, and change
TuringJapanSpeciesClassifier.description to use "22nd November 2024" to match
2024-11-22; ensure the same wording/format ("Trained on <ordinal> <Month> <Year>
by Turing team using Resnet50 model.") is preserved for each class
(TuringThailandSpeciesClassifier, TuringMadagascarSpeciesClassifier,
TuringJapanSpeciesClassifier).
| from ..common.logs import logger # noqa: F401 | ||
| from . import settings | ||
| from .models.classification import ( | ||
| from .models.classification import ( # noqa: E501 (disabled: Singapore - no category map, Thailand - map/weights mismatch) |
There was a problem hiding this comment.
Remove the unused noqa: E501 directive flagged by Ruff (RUF100).
E501 is not enabled in the linter config, so the suppression comment is dead. The explanatory text after it is useful and should be kept as a plain comment.
♻️ Proposed fix
-from .models.classification import ( # noqa: E501 (disabled: Singapore - no category map, Thailand - map/weights mismatch)
+from .models.classification import ( # disabled: Singapore - no category map, Thailand - map/weights mismatch📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| from .models.classification import ( # noqa: E501 (disabled: Singapore - no category map, Thailand - map/weights mismatch) | |
| from .models.classification import ( # disabled: Singapore - no category map, Thailand - map/weights mismatch |
🧰 Tools
🪛 Ruff (0.15.1)
[warning] 16-16: Unused noqa directive (non-enabled: E501)
Remove unused noqa directive
(RUF100)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@trapdata/api/api.py` at line 16, Remove the unused "noqa: E501" suppression
on the import line starting with "from .models.classification import (" (RUF100)
and convert the explanatory text that follows it ("disabled: Singapore - no
category map, Thailand - map/weights mismatch") into a regular inline or
above-line Python comment so the rationale is preserved but the dead noqa
directive is eliminated.
| class MothClassifierTuringThailand(APIMothClassifier, TuringThailandSpeciesClassifier): | ||
| pass |
There was a problem hiding this comment.
MothClassifierTuringThailand is missing a disable comment — inconsistent with MothClassifierTuringSingapore.
Line 253 has # Disabled: category map not available at this time before MothClassifierTuringSingapore. MothClassifierTuringThailand has no equivalent notice, even though it's also disabled and — more critically — will raise a RuntimeError on model.load_state_dict() due to the 3822 vs. 3800 class-count mismatch if anyone instantiates it directly.
♻️ Suggested comment
+# Disabled: model weights have 3800 output neurons but category map lists 3822 classes;
+# state_dict load will fail with a size-mismatch RuntimeError until corrected data is available.
class MothClassifierTuringThailand(APIMothClassifier, TuringThailandSpeciesClassifier):📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| class MothClassifierTuringThailand(APIMothClassifier, TuringThailandSpeciesClassifier): | |
| pass | |
| # Disabled: model weights have 3800 output neurons but category map lists 3822 classes; | |
| # state_dict load will fail with a size-mismatch RuntimeError until corrected data is available. | |
| class MothClassifierTuringThailand(APIMothClassifier, TuringThailandSpeciesClassifier): | |
| pass |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@trapdata/api/models/classification.py` around lines 249 - 250, Add a disable
comment above the MothClassifierTuringThailand class like the one used for
MothClassifierTuringSingapore to make its disabled state explicit and prevent
surprise errors; specifically note that this classifier is disabled because the
category map is not available and that attempting to instantiate it will raise a
RuntimeError in model.load_state_dict() due to a class-count mismatch (3822 vs.
3800). Place the comment immediately before the MothClassifierTuringThailand
class definition to mirror the existing pattern used for
MothClassifierTuringSingapore.
| class TuringThailandSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing): | ||
| name = "Turing Thailand Species Classifier" | ||
| description = "Trained on 11th November 2024 by Turing team using Resnet50 model." | ||
| weights_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" | ||
| labels_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/01_thailand_data_category_map.json" |
There was a problem hiding this comment.
Thailand class is missing a disable note — unlike Singapore.
TuringSingaporeSpeciesClassifier has a clear 3-line # NOTE: block explaining why it's disabled and what's missing (lines 472–474). TuringThailandSpeciesClassifier has no equivalent, despite also being disabled — and for a more dangerous reason: the category map has 3822 classes but the model outputs 3800 neurons, so model.load_state_dict() will throw a size-mismatch RuntimeError on any attempt to instantiate this class.
🛡️ Suggested comment block
+# NOTE: Thailand model has a class-count mismatch: category map lists 3822 classes
+# but the model was trained with 3800 output neurons. Loading state_dict will fail
+# with a size-mismatch RuntimeError. Disabled until corrected weights or map is provided.
class TuringThailandSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing):📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| class TuringThailandSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing): | |
| name = "Turing Thailand Species Classifier" | |
| description = "Trained on 11th November 2024 by Turing team using Resnet50 model." | |
| weights_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" | |
| labels_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/01_thailand_data_category_map.json" | |
| # NOTE: Thailand model has a class-count mismatch: category map lists 3822 classes | |
| # but the model was trained with 3800 output neurons. Loading state_dict will fail | |
| # with a size-mismatch RuntimeError. Disabled until corrected weights or map is provided. | |
| class TuringThailandSpeciesClassifier(SpeciesClassifier, Resnet50Classifier_Turing): | |
| name = "Turing Thailand Species Classifier" | |
| description = "Trained on 11th November 2024 by Turing team using Resnet50 model." | |
| weights_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/turing-thailand_v01_resnet50_2024-11-21-16-28_state.pt" | |
| labels_path = "https://object-arbutus.cloud.computecanada.ca/ami-models/moths/classification/01_thailand_data_category_map.json" |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@trapdata/ml/models/classification.py` around lines 451 - 455, Add a 3-line "#
NOTE:" comment block above the TuringThailandSpeciesClassifier declaration (like
the one above TuringSingaporeSpeciesClassifier) explaining that this classifier
is intentionally disabled because the labels file contains 3822 classes while
the Resnet50 model checkpoint has 3800 output neurons which causes
model.load_state_dict() to raise a size-mismatch RuntimeError; instruct
maintainers to not instantiate this class until the weights or labels are
corrected (or the checkpoint is replaced) and reference the class name
TuringThailandSpeciesClassifier and the failing call model.load_state_dict for
clarity.
Summary
TuringKenyaUgandaSpeciesClassifierclass definition from the upstream branchModel weights uploaded to object store
9 new files uploaded to
s3://ami-models/moths/classification/:turing-japan_v01_resnet50_2024-11-22-17-22_state.pt01_japan_data_category_map.jsonturing-madagascar_v01_resnet50_2024-07-01-13-01_state.pt01_madagascar_data_category_map.json02_madagascar_data_category_map.jsonturing-singapore_v02_resnet50_2024-11-21-19-58_state.ptturing-thailand_v01_resnet50_2024-11-21-16-28_state.pt01_thailand_data_category_map.jsonturing-anguilla_v02_resnet50_2024-11-19-19-17_state.pt02_anguilla_data_category_map_160cls.jsonAll URLs verified returning HTTP 200. Existing files were not overwritten.
Anguilla models
Two versions now available:
anguilla_moths_turing_2024anguilla_moths_turing_v02_2024Note: missing Singapore category map
02_singapore_data_category_map.jsonwas not in the original archive from UKCEH. The code references it but the file does not exist in the object store. The Singapore pipeline is disabled until this is resolved.Supersedes #72.
Test plan
Summary by CodeRabbit